package v2;

import java.awt.Color;
import java.util.HashMap;
import java.util.Hashtable;

public enum TypeAnimal {
	
	// int maxNourriture, int minNourriture, boolean predateur, boolean proie,
	// int champVision, String NomEspece, int besoinSexMax, int augmBesoinSex
	// int maxEau, int minEau, int maxSante, int facteurPerteEau, Color Couleur, int gainSante, int dureeVieInit
	CHEVRE (150, 50, false, true, 2,"Chèvre", 90, 5, 100, 10, 100, 5, Color.RED, 5, 55, "Renard", 1, "Loup", 1, "Lion", 1),
    RENARD (200, 32, true, false, 4, "Renard", 80, 5, 150, 15, 150, 5, Color.BLUE, 5, 60, "Loup", 1, "Dindon", 1, "Lion", 1),
    LOUP (250, 25, true, false, 6, "Loup", 100, 5, 200, 20, 200, 4, Color.BLACK, 10, 70, "Chèvre", 1, "Dromadaire", 1, "Bonobo", 1),
    CHACAL(200, 15, true, false, 3, "Chacal", 70, 5, 125, 10, 200, 3, Color.ORANGE, 15, 50, "Bonobo", 1, "Chèvre", 1, "Zèbre", 1),
    DROMADAIRE(150, 20, false, true, 3, "Dromadaire", 70, 5, 250, 10, 175, 1, Color.RED, 5, 60, "Loup", 1, "Chacal", 1, "Lion", 1),
    ANACONDA(25, 1, true, false, 1, "Anaconda", 50, 5, 25, 1, 100, 2, Color.GREEN, 10, 60, "Chèvre", 1, "Bonobo", 1, "Dindon", 1),
    DINDON(75, 10, false, true, 1, "Dindon", 50, 5, 25, 5, 150, 3, Color.BLACK, 5, 20, "Renard", 1, "Chacal", 1, "Lion", 1), 
    LION(250, 50, true, false, 4, "Lion", 100, 5, 200, 20, 250, 3, Color.YELLOW, 10, 60, "Chèvre", 1, "Dromadaire", 1, "Zèbre", 1),
    BONOBO(150, 75, false, true, 2, "Bonobo", 150, 5, 150, 30, 175, 3, Color.BLACK, 7, 60, "Chacal", 1, "Anaconda", 1 ,"Loup", 1),
    ZEBRE(200, 50, false, true, 5, "Zèbre", 100, 5, 175, 30, 200, 2, Color.WHITE, 10, 70, "Chacal", 1, "Lion", 1, "Bonobo", 0);
	
	// TODO: Javadoc, refaire le remplissage des HashTab en fonction des booleen
	
	
	///////////////
	// Attributs //
	///////////////
	
	
	/**
	 * 
	 */
	int augmBesoinSex;
	
	/**
	 * 
	 */
	int besoinSexMax;


	/**
	 * La Quantité maximum d'eau que peut contenir l'animal.
	 * 
	 * @see 
	 */
	private int maxEau;

	/**
	 * La Quantité minimum d'eau que peut contenir l'animal.
	 * 
	 * @see 
	 */
	private int minEau;

	/**
	 * La Santé maximum de l'animal.
	 * 
	 * @see 
	 */
	private int maxSante;

	/**
	 * Le facteur de perte d'eau de l'animal.
	 * 
	 * @see 
	 */
	private int facteurPerteEau;

	/**
	 * La couleur de l'animal.
	 * 
	 * @see 
	 */
	private Color Couleur; 

	/**
	 * La capacité de regénération de vie de l'animal.
	 * 
	 * @see
	 */
	private int gainSante;

	

	/** 
	 * La duree de vie initiale de l'animal.
	 * 
	 * @see
	 */
	private int dureeVieInit;
	
	//////
	
    private final String nomEspece;
    private Hashtable<String, Integer> predateurs;
    private Hashtable<String, Integer> proies;
    
	/**
	 * La quantité maximale de nourriture que peut contenir l'animal
	 * 
	 * @see Entite#Entite(int,int,Position,int,int,int,int,Color,int,int)
	 * @see Animaux#Animaux(int,int,Position,int,int,int,int,Color,int,int,int,int,boolean,boolean,boolean,int,String,HashMap,HashMap)
	 */
	private int maxNourriture;
	
	/**
	 * La quantité minimale de nourriture que peut contenir l'animal
	 * 
	 * @see Entite#Entite(int,int,Position,int,int,int,int,Color,int,int)
	 * @see Animaux#Animaux(int,int,Position,int,int,int,int,Color,int,int,int,int,boolean,boolean,boolean,int,String,HashMap,HashMap)
	 */
	private int minNourriture;
	
	/**
	 * L'animal est un prédateur
	 * 
	 * @see Entite#Entite(int,int,Position,int,int,int,int,Color,int,int)
	 * @see Animaux#Animaux(int,int,Position,int,int,int,int,Color,int,int,int,int,boolean,boolean,boolean,int,String,HashMap,HashMap)
	 */
	private boolean predateur;
	
	/**
	 * L'animal est une proie
	 * 
	 * @see Entite#Entite(int,int,Position,int,int,int,int,Color,int,int)
	 * @see Animaux#Animaux(int,int,Position,int,int,int,int,Color,int,int,int,int,boolean,boolean,boolean,int,String,HashMap,HashMap)
	 */
	private boolean proie;
	
	/**
	 * Le champ de vision de l'animal
	 * 
	 * @see Entite#Entite(int,int,Position,int,int,int,int,Color,int,int)
	 * @see Animaux#Animaux(int,int,Position,int,int,int,int,Color,int,int,int,int,boolean,boolean,boolean,int,String,HashMap,HashMap)
	 */
	private int champVision = 2;
    
	///////////////////////
    // Constructeurs //////
    ///////////////////////

	// Constructeur par défaut
	/**
	 * 
	 */
	TypeAnimal(int maxNourriture, int minNourriture, boolean predateur, boolean proie,
    		int champVision, String monEspece, int besoinSexMax, int augmBesoinSex, int maxEau, int minEau, int maxSante,
    		int facteurPerteEau, Color Couleur, int gainSante, int dureeVieInit)
    {
		// Attributs propres aux animaux
		this.maxNourriture = maxNourriture; 
		this.minNourriture = minNourriture;
		this.predateur =  predateur;
		this.proie = proie;
		this.champVision = champVision;
		this.nomEspece = monEspece;

		// Attributs à passer au constructeur d'entité
		this.maxEau = maxEau;
		this.minEau = minEau;
		this.maxSante = maxSante;
		this.facteurPerteEau = facteurPerteEau;
		this.Couleur = Couleur;
		this.gainSante = gainSante;
		this.dureeVieInit = dureeVieInit;		
    
		predateurs = new  Hashtable<String, Integer>();
		proies = new  Hashtable<String, Integer>();
    }
	
    // est une proie uniquement...
	/**
	 * 
	 */
	TypeAnimal(int maxNourriture, int minNourriture, boolean predateur, boolean proie,
    		int champVision, String monEspece, int besoinSexMax, int augmBesoinSex, int maxEau, int minEau, int maxSante,
    		int facteurPerteEau, Color Couleur, int gainSante, int dureeVieInit,
    		String pred1, int facteurPred1, String pred2, int facteurPred2, String pred3, int facteurPred3) {
        
		this(maxNourriture, minNourriture, predateur, proie, champVision, monEspece, besoinSexMax, augmBesoinSex, maxEau, minEau, maxSante, facteurPerteEau, Couleur, gainSante, dureeVieInit);
		
		// Attributs des proies
    	try
        {
        	predateurs.put(pred1, facteurPred1);
        	predateurs.put(pred2, facteurPred2);
        	predateurs.put(pred3, facteurPred3);
        }
        catch (Exception e)
        {
        	this.predateurs = null;
        }
        
        this.proies = null;
    }

    /**
     * A faire
     * 
     * @param maxNourriture
     * @param minNourriture
     * @param predateur
     * @param proie
     * @param champVision
     * @param monEspece
     * @param maxEau
     * @param minEau
     * @param maxSante
     * @param facteurPerteEau
     * @param Couleur
     * @param gainSante
     * @param dureeVieInit
     * @param proie1
     * @param proie2
     * @param proie3
     * @param facteurProie1
     * @param facteurProie2
     * @param facteurProie3
     */
    // est un predateurs uniquement
    TypeAnimal(int maxNourriture, int minNourriture, boolean predateur, boolean proie,
    		int champVision, String monEspece, int besoinSexMax, int augmBesoinSex, int maxEau, int minEau, int maxSante,
    		int facteurPerteEau, Color Couleur, int gainSante, int dureeVieInit,
    		String proie1, String proie2,String proie3,int facteurProie1, int facteurProie2, int facteurProie3) {

    	this(maxNourriture, minNourriture, predateur, proie, champVision, monEspece, besoinSexMax, augmBesoinSex, maxEau, minEau, maxSante, facteurPerteEau, Couleur, gainSante, dureeVieInit);
        
        try
        {
        	
        	proies.put(proie1, facteurProie1);
        	proies.put(proie2, facteurProie2);
        	proies.put(proie3, facteurProie3);
        }
        catch (Exception e)
        {
        	this.proies = null;
        }
        
        predateurs = null;
    }
    
    // predateur et proie...
    TypeAnimal(int maxNourriture, int minNourriture, boolean predateur, boolean proie,
    		int champVision, String monEspece, int besoinSexMax, int augmBesoinSex, int maxEau, int minEau, int maxSante,
    		int facteurPerteEau, Color Couleur, int gainSante, int dureeVieInit,
    		String pred1, int facteurPred1, String pred2, int facteurPred2, 
    		String pred3, int facteurPred3, String proie1, int facteurProie1, String proie2,
    		int facteurProie2, String proie3, int facteurProie3) {
        
    	this(maxNourriture, minNourriture, predateur, proie, champVision, monEspece, besoinSexMax, augmBesoinSex, maxEau, minEau, maxSante, facteurPerteEau, Couleur, gainSante, dureeVieInit, pred1, facteurPred1, pred2, facteurPred2,  pred3, facteurPred3);
    	
    	try
        {
        	
        	proies.put(proie1, facteurProie1);
        	proies.put(proie2, facteurProie2);
        	proies.put(proie3, facteurProie3);
        }
        catch (Exception e)
        {
        	this.predateurs = null;
        }
    }
    
    
    
    ////////////////////////
    // Getters et setters //
    ////////////////////////
    
    
    String monEspece()   { return nomEspece; }
    Hashtable<String, Integer> predateurs()   { return predateurs; }
    Hashtable<String, Integer> proies()   { return proies; }
    
    /**
	 * Retourne le maximum de nourriture que peut ingérer un animal
	 * 
	 * @return le maximum de nourriture de l'animal
	 */
	public int maxNourriture() {
		return maxNourriture;
	}

	/**
	 * Retourne le minimum de nourriture que doit ingérer un animal
	 * 
	 * @return le minimum de nourriture de l'animal
	 */
	public int minNourriture() {
		return minNourriture;
	}

	/**
	 * Retourne si l'animal est un predateur
	 * 
	 * @return le predateur
	 */
	public boolean predateur() {
		return predateur;
	}

	/**
	 * Retourne si l'animal est une proie
	 * 
	 * @return la proie
	 */
	public boolean proie() {
		return proie;
	}

	/**
	 * Retourne le champ de vision de l'animal
	 * 
	 * @return le champ de vision de l'animal 
	 */
	public int champVision() {
		return champVision;
	}
    
	/**
	 * Retourne le maximum d'eau que peut contenir un animal
	 * 
	 * @return le maximum d'eau de l'animal
	 */
	public int maxEau() {
		return maxEau;
	}

	/**
	 * Retourne le minimum d'eau que doit contenir un animal
	 * 
	 * @return le minimum d'eau de l'animal
	 */
	public int minEau() {
		return minEau;
	}

	/**
	 * Retourne la maximum de santé de l'animal
	 * 
	 * @return le maximum de santé de l'animal
	 */
	public int maxSante() {
		return maxSante;
	}

	/**
	 * Retourne le facteur de perte d'eau lié à l'animal
	 * 
	 * @return le facteur de perte d'eau de l'animal
	 */
	public int facteurPerteEau() {
		return facteurPerteEau;
	}

	/** 
	 * Retourne la couleur associée à l'animal
	 * 
	 * @return la couleur de l'animal
	 */
	public Color Couleur() {
		return Couleur;
	}

	/**
	 * Retourne le gain de santé qu'obtient l'animal
	 * 
	 * @return le gain de santé
	 */
	public int gainSante() {
		return gainSante;
	}

	/**Retourne la durée de vie initiale attribuée à l'animal
	 * 
	 * @return la durée de vie initiale de l'animal
	 */
	public int dureeVieInit() {
		return dureeVieInit;
	}
	
	/**
	 * @return the augmBesoinSex
	 */
	public int augmBesoinSex() {
		return augmBesoinSex;
	}

	/**
	 * @return the besoinSexMax
	 */
	public int besoinSexMax() {
		return besoinSexMax;
	}
	
	/**
	 * Méthode qui calcul le facteur de risque lié au prédateur
	 * 
	 * @param monTypePredateur
	 * @return
	 */
	public int obtientFacteurPredateur(TypeAnimal monTypePredateur)
	{
		if (predateurs().containsValue(monTypePredateur.monEspece()))
		{
			return predateurs().get(monTypePredateur.monEspece());
		}
		else
		{
			return (Integer) null;
		}
	}
	
	public String toString()
	{
		String myString = new String("");
		
		myString+=" nom espece: "+this.nomEspece;
		myString+=" duree de Vie init: "+this.dureeVieInit;
		
		return myString;
	}
	
}
